/**
 * 深度获取
 * @param dataIndex  string | string[]
 * @param data  Object
 * @returns unknow
 */
export function getValueByModel(dataIndex: string| string[], data: {[key: string]: any}): any {

  if(!data) return data;

  if (Array.isArray(dataIndex) && dataIndex.length === 1) {
    return data[dataIndex[0]];
  } else if(Array.isArray(dataIndex)){
    let key = dataIndex[0];
    return getValueByModel(dataIndex.slice(1), data[key]);
  }
  else{
      return data[dataIndex];
  }
}

  /**
 * 检测字符串是中文（zh）、英文（en），还是既有中文也有英文（zh-en）
 * @param str 
 * @returns "zh" | "en" | "zh-en"
 * // 测试示例
      console.log(isChineseOrEnglish("Hello"));        // 输出: 字符串是英文
      console.log(isChineseOrEnglish("你好"));         // 输出: 字符串是中文
      console.log(isChineseOrEnglish("Hello你好"));    // 输出: 字符串同时包含中文和英文
      console.log(isChineseOrEnglish("12345"));        // 输出: 字符串是英文（因为只包含数字，这里也视为英文）
 */
export function isChineseOrEnglish(str: string): "zh" | "en" | "zh-en" {
  let chineseCount = 0;
  let englishCount = 0;

  for (let i = 0; i < str.length; i++) {
      const char = str.charAt(i);

      // 判断字符是否为中文字符
      if (/[\u4e00-\u9fa5]/.test(char)) {
          chineseCount++;
      } 
      // 判断字符是否为英文字符（a-z, A-Z, 0-9）
      else if (/^[a-zA-Z0-9]$/.test(char)) {
          englishCount++;
      }
  }

  // 根据统计结果，输出字符串是中文还是英文，或者同时包含中文和英文
  if (chineseCount > 0 && englishCount === 0) {
      return "zh";
  } else if (chineseCount === 0 && englishCount > 0) {
      return "en";
  } else {
      return "zh-en";
  }
}

/**
 * 是否是中文
 * @param temp 
 * @returns Boolean
 */
export function isChinese(temp?: string){
  if (!temp) return false;
  return isChineseOrEnglish(temp) === 'zh';
}

/**
 * 是否是英文
 * @param temp 
 * @returns 
 */
export function isEnglish(temp?: string) {
  if (!temp) return false;
  return  isChineseOrEnglish(temp) === 'en';
}

export function debounce(fn: Function, wait: number = 300) {
  let timeout: any = null;
  return function() {
      let context = this;
      let args = arguments;

      if (timeout) clearTimeout(timeout);
      let callNow = !timeout;

      timeout = setTimeout(() => {
          timeout = null;
      }, wait);
      
      if (callNow) fn.apply(context, args);
  };
}

